package jp.ac.u_tokyo.dch.action.front;

import java.util.ArrayList;

import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.model.xml.DisplayDefine;
import jp.ac.u_tokyo.dch.model.xml.DisplayItems;
import jp.ac.u_tokyo.dch.model.xml.FrontInfo;
import jp.ac.u_tokyo.dch.model.xml.FrontItem;
import jp.ac.u_tokyo.dch.service.DaoServiceAware;
import jp.ac.u_tokyo.dch.service.FrontService;
import jp.ac.u_tokyo.dch.util.XmlCommonUtil;
import jp.ac.u_tokyo.dch.util.front.FrontDisplayUtil;
import jp.ac.u_tokyo.dch.view.Constants;

import com.opensymphony.xwork2.ActionSupport;

/**
 * フロント表示設定でFLEXと通信を担当
* @version 1.1
 *
 */
public class FrontFlexAction extends ActionSupport implements DaoServiceAware {

	/**
	 *シリアル番号
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * サービス
	 */
	private FrontService service = null;

	/**
	 * 画面表示項目
	 */
	private String itemXmlResult;

	/**
	 * 画面表示項目（DBに登録されている）
	 */
	private String itemXmlResultByDb;

	/**
	 * FLEXで入力した情報
	 */
	private String frntXML;

	/**
	 * FLEXで入力した情報を保存するオブジェクト
	 */
	private FrontInfo frontInfo;



	private String keySchemaid;

	private String actionType;

	private String displayId;

	private String displaySort;
	/**
	 * 画面定義オブジェクト
	 */
	private DisplayDefine define;
	/**
	 * DBコネクションオブジェクト
	 */
	private DBConnection dbConnection = null;

	/**
	 * 画面表示項目を取得する
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String itemXmlResult() throws Exception {

		service = new FrontService(dbConnection);

		DisplayItems displayItems = null;
		FrontInfo frontInfo = null;
		if (Constants.DISPLAY_SORT_META.equals(displaySort)) {
			displayItems = service.getDisplayItemXmlByMetaData(keySchemaid);

			if (!Constants.ADD.equals(actionType)) {
				frontInfo = service.getFrontInfo(displayId);
			} else {
				frontInfo = new FrontInfo();
				frontInfo.setList(new ArrayList<FrontItem>());
			}

		} else {
			displayItems = service.getDisplayItemXml(keySchemaid);

			if (!Constants.ADD.equals(actionType)) {
				frontInfo = service.getFrontInfo(displayId);
			} else {
				frontInfo = new FrontInfo();
				frontInfo.setList(new ArrayList<FrontItem>());
			}
		}

		itemXmlResult = XmlCommonUtil.ObjectToXml(displayItems);
		itemXmlResultByDb = XmlCommonUtil.ObjectToXml(frontInfo);

		return SUCCESS;
	}
	/**
	 * FLEXから入力された情報を元でPreViewテーブルを作成する
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String getFrontTable() throws Exception{

		frontInfo = XmlCommonUtil.xmlToObject(frntXML, FrontInfo.class);
		define = FrontDisplayUtil.frontInfoToDefine(frontInfo);

		return SUCCESS;
	}

	/**
	 * PreView
	 * @return 結果
	 * @throws Exception 例外
	 */
	public String prewView() throws Exception{

		return SUCCESS;
	}


	@Override
	public void setDBConnection(DBConnection con) {
		dbConnection = con;
	}
	/**
	 * 画面表示項目を返す
	 * @return 画面表示項目
	 */
	public String getItemXmlResult() {
		return itemXmlResult;
	}
	/**
	 * FLEXで入力した情報を返す
	 * @return FLEXで入力した情報
	 */
	public String getFrntXML() {
		return frntXML;
	}
	/**
	 * 物理ファイル名をセットする
	 * @param 物理ファイル名
	 */
	public void setFrntXML(String frntXML) {
		this.frntXML = frntXML;
	}
	/**
	 *LEXで入力した情報を保存するオブジェクトを返す
	 * @return LEXで入力した情報を保存するオブジェクト
	 */
	public FrontInfo getFrontInfo() {
		return frontInfo;
	}
	/**
	 * LEXで入力した情報を保存するオブジェクトを返す
	 * @return LEXで入力した情報を保存するオブジェクト
	 */
	public DisplayDefine getDefine() {
		return define;
	}
	/**
	 * 分類を返す
	 * @return 分類
	 */
	public String getDisplaySort() {
		return displaySort;
	}
	/**
	 * 分類をセットする
	 * @param 分類
	 */
	public void setDisplaySort(String displaySort) {
		this.displaySort = displaySort;
	}
	/**
	 * 画面表示項目（DBに登録されている）を返す
	 * @return  画面表示項目（DBに登録されている）
	 */
	public String getItemXmlResultByDb() {
		return itemXmlResultByDb;
	}
	public void setKeySchemaid(String keySchemaid) {
		this.keySchemaid = keySchemaid;
	}
	public void setActionType(String actionType) {
		this.actionType = actionType;
	}
	public void setDisplayId(String displayId) {
		this.displayId = displayId;
	}


}
